package com.ztom.top100;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 字母异位词分组
 * <p>
 * https://leetcode-cn.com/problems/group-anagrams/
 *
 * @author ZhangTao
 */
public class Code23GroupAnagrams {

    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) {
            return null;
        }

        // 考虑将同样字符组成的字符串用一个唯一的方式表示, 然后作为 key 存入 map
        // 1.排序后直接 hash, 可能会出现 hash 冲突
        // 2.每个字符用一个质数表示, 不管顺序如何, 多个字符乘积一定一样
        Map<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            map.computeIfAbsent(String.valueOf(chars), k -> new ArrayList<>()).add(str);
        }
        return new ArrayList<>(map.values());
//        return new ArrayList<>(Arrays.stream(strs)
//                .collect(Collectors.groupingBy(str ->
//                        str.chars()
//                        .sorted()
//                        .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString()))
//                .values());
    }
}
